/*
众所周知，小葱同学擅长计算，尤其擅长计算一个数是否是另外一个数的倍数。

但小葱只擅长两个数的情况，当有很多个数之后就会比较苦恼。

现在小葱给了你 n 个数，希望你从这 n 个数中找到三个数，使得这三个数的和是 K 的倍数，且这个和最大。

数据保证一定有解。

输入格式
第一行包括 2 个正整数 n, K。

第二行 n 个正整数，代表给定的 n 个数。

输出格式
输出一行一个整数代表所求的和。

数据范围
1≤n≤105,
1≤K≤103,
给定的 n 个数均不超过 108
输入样例：
4 3
1 2 3 4
输出样例：
9
*/
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 1010;
int res = 0;
int m[N]; // 存储当前%K最大值；
int main(int argc, char const *argv[])
{
    int n, K;
    cin >> n >> K;
    for (int i = 0; i < n; i++)
    {
        int x;
        cin >> x;
        int t = x % K;
        if (x > m[t])
            m[t] = x;
    }
    for (int i = 0; i < K; i++)
        for (int j = 0; j < K; i++)
        {
            if (i == j)
                continue;
            int a = m[i], b = m[j], c = m[K - (a + b) % K];
            res = max(res, a + b + c);
        }
    cout << res << endl;
    return 0;
}
